vue axios采用formdata传参后端springboot接收中文乱码解决办法

您所在的位置:网站首页 springboot 下载文件乱码 vue axios采用formdata传参后端springboot接收中文乱码解决办法

vue axios采用formdata传参后端springboot接收中文乱码解决办法

2024-05-29 23:24| 来源: 网络整理| 查看: 265

一、问题: 前端代码: // 新建form表单 // this.lessonName是个字符串名字,this.upath是一份文档 // 请求头的编码格式为:Content-Type: multipart/form-data const fd = new FormData() fd.append('lessonName', this.lessonName) fd.append('file', this.upath) this.$http.post('/simulation/lesson/add1', fd).then(res => {     if (res) {         this.$message.success(res.data.msg)         this.load();         this.dialogFormVisible = false;         this.clearFile();     } else {         this.$message.error(res.data.msg)     } }) 后端代码: // 接收函数编写。此时接收的文件file可以正常使用,但lessonName显示为乱码 // 原因是:formdata传递参数,参数会被二进制化。后端接收的时候默认格式为iso_8859_1 // 这是因为StringHttpMessageConverter读和写的编码方式是:ISO-8859-1 @PostMapping( "/add") public ResultVO add(@RequestPart(value = "lessonName") String lessonName,                     @RequestParam(value = "file", required = false) MultipartFile file) {     if (simulationLessonService.valLessonName(lessonName)){         return new ResultVO(ResStatus.NO,"课程名已存在",false);     }     SimulationLessonDTO lessonDTO = new SimulationLessonDTO();     lessonDTO.setLessonName(lessonName); …… 解决思路

1,前端传参时写明编码格式;

2,前端传参时先进行编码再传递;

3,后端接收时采用全局设置参数;

4,后端修改tomcat配置;

5,后端修改Servlet配置;

6,后端编写全局过滤器,设置request请求编码格式;

7,局部修改,硬解码。

根据上面的思路,做了一些测试。最后有两条成功办法。有些思路没有测,毕竟只是做项目,不是做科研。先说说失败的方法,后附两条成功的方法。

失败方法:

1,springboot配置文件(失败)

# 服务器配置 server: servlet: encoding: charset: utf-8 enabled: true force: true tomcat: uri-encoding: UTF-8

2,声明接收格式(失败)

@PostMapping(value = "/add",produces = "text/plain;charset=UTF-8")

3,在jwtfilter中修改request接收参数格式(失败)

@Override protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {     HttpServletRequest httpServletRequest = (HttpServletRequest) request;     HttpServletResponse httpServletResponse = (HttpServletResponse) response;     httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));     httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");     httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));     httpServletRequest.setCharacterEncoding("UTF-8");     // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态     if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {         httpServletResponse.setStatus(HttpStatus.OK.value());         return false;     }     return super.preHandle(request, response); }

4,编写全局过滤器(失败)

//字符编码过滤器 @WebFilter(urlPatterns = "/*",filterName = "CharacterEncodingFilter") public class CharacterEncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); filterChain.doFilter(request , response); } @Override public void destroy() { } } 成功方法:

1,硬改接收参数编码(成功,但不是全局的,仅能解决燃眉之急)

@PostMapping( "/add1") public ResultVO add1(@RequestPart(value = "lessonName") String lessonName1,                     @RequestParam(value = "file", required = false) MultipartFile file) {     String lessonName = new String(lessonName1.getBytes(StandardCharsets.ISO_8859_1));     if (simulationLessonService.valLessonName(lessonName)){         return new ResultVO(ResStatus.NO,"课程名已存在",false);     }     SimulationLessonDTO lessonDTO = new SimulationLessonDTO();     lessonDTO.setLessonName(lessonName);     ……

2,编写全局编码转换器(成功,最终采用的也是这个)

/** * 中文乱码解决 */ @Configuration public class CharsetConfig extends WebMvcConfigurerAdapter { @Bean public HttpMessageConverter responseBodyConverter() { StringHttpMessageConverter converter = new StringHttpMessageConverter( Charset.forName("UTF-8")); return converter; } @Override public void configureMessageConverters(List> converters) { super.configureMessageConverters(converters); converters.add(responseBodyConverter()); } @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false); } } 其它办法,未测试

1(思路应该是一样的),

@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void extendMessageConverters(List clazz) { return String.class == clazz; } @Override protected String readInternal(Class> converters) { WebMvcConfigurer.super.configureMessageConverters(converters); converters.add(responseBodyConverter()); }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3